home *** CD-ROM | disk | FTP | other *** search
- ************************************************************
- * *
- * MKDIR - Create Subdirectory *
- * *
- * This subprogram will make a subdirectory. *
- * *
- ************************************************************
-
- MKDIR0
- ANDI R12,>FF00
- AI R12,24
-
- MOVB @>834C,R6
- ANDI R6,>0F00
- JEQ MKDER7
- AI R6,->0100
-
- BL @MAKEFN
- BL @GETDDR Get directory info
- CI R5,0
- JEQ MKDER7
-
- * We know the parent directory exists.
-
- MKD1
- LDCR @B03,4 Select BANK with DDR in it.
- MOVB @23(R5),R1 See if there is room for one
- SRL R1,8 more subdirectory.
- CI R1,114
- JEQ MKDER4 See if there are too many subdirectories
- CLR R0
-
- * OK. We know there's room for it. If it doesn't exist,
- * create it.
-
- * Copy the name to the FNCB in Bank 0
-
- LI R2,NCB+39
- LDCR @B02,4
- MKD3 CB *R2,@PERIOD
- JEQ MKD4
- DEC R2
- CI R2,NCB-1
- JNE MKD3
-
- MKD4 LI R3,FNCB
- INC R2
- MKD5 LDCR @B02,4
- CB *R2,@SPACE
- JEQ MKD6
- CI R2,NCB+40
- JEQ MKD6
- MOVB *R2+,R10
- LDCR @ZERO,4
- MOVB R10,*R3+
- JMP MKD5
-
- MKD6 LDCR @ZERO,4
- MKD7 CI R3,FNCB+10
- JEQ MKD8
- MOVB @SPACE,*R3+
- JMP MKD7
-
- MKDER7 MOVB @B07,@>8350
- LDCR @ZERO,4
- B @DSRRT
-
- MKD8
- CI R1,0
- JEQ MKD16
-
- CLR R0
- DEC R1
- MKD9 MOV R0,R10
- A R1,R10
- ANDI R10,>FFFE
- A R5,R10
- LDCR @B03,4
- MOV @28(R10),R7
- MOV R6,R3
- SRL R3,8
- SLA R3,1
- LDCR @B04,4
- MPY @SAUTBL(R3),R7
- LI R2,SECBUF
- SRL R8,1
- JNC MKD10
- AI R2,>100
- MKD10 SRL R7,1
- JNC MKD11
- AI R8,>8000
- MKD11 LDCR @ZERO,4
- BLWP @BANKIT
- DATA SCSIRD
- JNE MKDERR
-
- LI R7,FNCB
- LI R8,10
- MKD12 C *R2+,*R7+
- JL MKD13
- JH MKD14
- DECT R8
- JNE MKD12
- JMP MKDER7 Directory already exists!
-
- MKDERR MOVB @B06,@>8350 Set error code
- LDCR @ZERO,4
- B @DSRRT
-
- MKDER4 MOVB @B04,@>8350 Out of space - directory full
- LDCR @ZERO,4
- B @DSRRT
-
- MKD13 C R0,R1
- JEQ MKD15
- MOV R0,R10
- A R1,R10
- SRL R10,1
- INC R10
- MOV R10,R0
- JMP MKD9
-
- MKD14 C R0,R1
- JEQ MKD16
- MOV R0,R10
- A R1,R10
- SRL R10,1
- C R10,R0
- JEQ MKD16
- MOV R10,R1
- DEC R1
- JMP MKD9
-
- MKD15 INC R0
- MKD16
- LDCR @B02,4
- MOV R0,@MKDIDX
-
- * Now set up the new subdirectory
- * Let's allocate an AUs for the DDR and its FDIR
- *
- CLR R3 Start at beginning
- CLR R7 No preferred AU
- LI R8,2
- LDCR @ZERO,4
- BLWP @ALLOC
- JNE MKDERR
-
- CI R4,0 See if disk is full
- JEQ MKDER4
-
- LDCR @B02,4 Save the AU
- MOV R5,@MKDAU1
-
- INC R5
- CI R4,1
- JNE MKD17
-
- * We only got 1 AU, allocate another for the FDIR
- *
- LI R8,1
- LDCR @ZERO,4
- BLWP @ALLOC
- JNE MKDERR
- CI R4,0
- JEQ MKDERR
- LDCR @B02,4
- MKD17 MOV R5,@MKDAU2
-
- * Now build the new DDR in the DFDR buffer
- *
-
- * Start by filling in the new directory name
- *
- LI R0,10
- LI R1,DFDR
- LI R2,FNCB
- MKD18
- LDCR @ZERO,4
- MOV *R2+,R3
- LDCR @B02,2
- MOV R3,*R1+
- DECT R0
- JNE MKD18
-
- LI R2,MKDRST
- MKD19 MOV *R2+,*R1+
- CI R2,MKDRND
- JNE MKD19
-
- * Now put in the AU of the FDIR. If we only got 1 AU on the
- * call to ALLOC, we have to allocate another one.
- *
- MOV @MKDAU2,*R1+
-
- LDCR @B04,4 Get AU of parent DDR
- MOV @SAVEAU,R0
- LDCR @B02,4
- MOV R0,*R1+
-
- * Now blank out all subdirectory pointers
-
- MKD20 CLR *R1+
- CI R1,DFDR+256
- JNE MKD20
-
- * We got the DDR set up, now write it out to disk.
- *
-
- MOV @MKDAU1,R7
- MOV R6,R3
- SRL R3,8
- SLA R3,1
- LDCR @B04,4
- MOV @SAUTBL(R3),R3
- MPY R3,R7
- LI R2,SECBUF
-
- SRL R8,1
- JNC MKD21
- AI R2,>100
- MKD21 SRL R7,1
- JNC MKD22
- AI R8,>8000
- MKD22
- LDCR @ZERO,4
-
- * If we are using >1 sector/au and we are in the 1st half of
- * the 512 byte block, there is no need to read the old data
-
- CI R3,1
- JEQ MKD23
- CI R2,SECBUF
- JEQ MKD24
- * CI R7,0
- * JNE MKD24
- * CI R8,0
- * JNE MKD24
- MKD23
- BLWP @BANKIT
- DATA SCSIRD
- JNE MKD29
- MKD24
- LI R0,256
- LI R4,DFDR
- MKD25 LDCR @B02,4
- MOV *R4+,R9
- LDCR @ZERO,4
- MOV R9,*R2+
- DECT R0
- JNE MKD25
-
- BLWP @BANKIT
- DATA SCSIWT
- JNE MKD29
-
- * If we're writing out the VIB, write out the copy as well
-
- CI R7,0
- JNE MKD25A
- CI R8,0
- JNE MKD25A
- AI R8,16
- BLWP @BANKIT
- DATA SCSIWT
- MKD25A
- * Now we'll write out the FDIR. All entries are blank except
- * for the last one which points back to the DDR
-
- MOV R5,R7
- MPY R3,R7
- LI R2,SECBUF
-
- SRL R8,1
- JNC MKD26
- AI R2,>100
- MKD26 SRL R7,1
- JNC MKD27
- AI R8,>8000
- MKD27
- LDCR @ZERO,4
-
- CI R3,1
- JEQ MKD28
- CI R2,SECBUF
- JEQ MKD30
-
- MKD28 BLWP @BANKIT
- DATA SCSIRD
- JEQ MKD30
- MKD29 B @MKDERR
-
- MKD30 LI R0,254
- MKD31 CLR *R2+
- DECT R0
- JNE MKD31
-
- LDCR @B02,4 Now get AU of DDR
- MOV @MKDAU1,R5
- LDCR @ZERO,4
- MOV R5,*R2
-
- BLWP @BANKIT
- DATA SCSIWT
- JNE MKD29
-
- * Now write out the DDR to disk. Increment the # of files
- * and add the AU to the table of subdirectories
- *
- BL @GETDDR
- LDCR @B03,4 Select RAM bank 3
- AB @B01,@23(R5) Increment # of subdirectories
-
- * the AU of the new DDR goes
- *
- LDCR @B02,4
- MOV @MKDIDX,R10
- LDCR @B03,4
- SLA R10,1
- A R5,R10
- AI R10,28
-
- MOV R5,R1
- AI R1,254
-
- MKD32 C R1,R10
- JEQ MKD33
- MOV @-2(R1),*R1
- DECT R1
- JMP MKD32
- MKD33
- LDCR @B02,4 Save the AU
- MOV @MKDAU1,R2
- LDCR @B03,4
- MOV R2,*R1
-
- * Now write the parent DDR back out to disk and
- * we're done!
- *
- LDCR @B04,4
- MOV @SAVEAU,R7 Get AU of parent DDR
-
- MOV R6,R3
- SRL R3,8
- SLA R3,1
- MOV @SAUTBL(R3),R3
- MPY R3,R7
- LI R2,SECBUF
- SRL R8,1
- JNC MKD34
- AI R2,>100
- MKD34 SRL R7,1
- JNC MKD35
- AI R8,>8000
- MKD35
- LDCR @ZERO,4
-
- * We don't have to read the old data if we have more
- * than 1 sector/AU and we're writing at the beginning
- * of a 512 byte block. However, if we're writing
- * out the VIP, we must read because the bitmap.
-
- CI R3,1
- JEQ MKD36
- CI R2,SECBUF
- JNE MKD36
- CI R7,0
- JNE MKD37
- CI R8,0
- JNE MKD37
-
- MKD36 BLWP @BANKIT
- DATA SCSIRD
- JNE MKD39
-
- MKD37 LI R0,256
- MKD38 LDCR @B03,4
- MOV *R5+,R1
- LDCR @ZERO,4
- MOV R1,*R2+
- DECT R0
- JNE MKD38
-
- BLWP @BANKIT
- DATA SCSIWT
- JEQ MKD40
- MKD39 B @MKDERR
-
- * Hooray! We're done. Write out a success code and return
-
- MKD40 MOVB @ZERO,@>8350
- B @DSRRT
-
- MKDRST DATA 0
- BYTE 0
- TEXT 'DIR'
- DATA 0 Sectors/AU
- DATA 0,0 Date/Time of creation
- BYTE 0 # of files
- BYTE 0 # of subdirectories
- MKDRND
-